package Robots;

/**
 * <strong>Hauptklasse</strong><br />
 * Ein Roboter besteht aus einem Namen (String), einem Baujahr (Integer) und einem Zustand 
 * (Boolean) der "eingeschlatet" bzw. "ausgeschaltet" representiert. Auf alle 
 * Instanzvariablen kann mit Hilfe der entsprechenden Instanzmethoden zugegriffen werden.
 * Jedem Roboter wird eine eindeutige ID zugeordnet.
 * @author Torbjoern Klatt
 */
public class Roboter {
    // Instanzvariablen
    private String name;
    private int baujahr, id;
    private boolean status = false; // Roboter sind bei Erzeugung ausgeschaltet
    
    // Klassenvariablen
    static int count = 0; // identifiziert einen Roboter eindeutig
    
    //*******************************
    // Konstruktoren
    /**
     * erzeugt ein Objekt vom Typ Roboter
     * @param s Name
     */
    public Roboter(String s) {
        this.name = s;
        this.id = count;
        count++;
    }
    /**
     * Standardkonstruktor<br />
     * name: default
     */
    public Roboter() {
        this("default");
    }

    /**
     * erzeugt ein Objekt vom Typ Roboter
     * @param s Name
     * @param bj Baujahr
     */
    public Roboter(String s, int bj) {
        this(s);
        this.baujahr = bj;
    }

    //*******************************
    // Getter
    /**
     * @return Baujahr
     */
    public int getBaujahr() {
        return baujahr;
    }
    
    /**
     * @return eindeutige Kennung des Roboters
     */
    public int getID() {
        return id;
    }

    /**
     * @return String
     */
    public String getName() {
        return name;
    }

    /**
     * @return Status
     */
    public boolean isOn() {
        return status;
    }

    //*******************************
    // Setter
    /**
     * @param bj Baujahr
     */
    public void setBaujahr(int bj) {
        baujahr = bj;
    }

    /**
     * @param s Name
     */
    public void setName(String s) {
        name = s;
    }

    /**
     * schaltet Roboter ein<br />
     * status -> true
     */
    public void switchOn() {
        status = true;
        System.out.println(this.getName()+" wurde eingeschaltet.");
    }

    /**
     * schaltet Roboter aus<br />
     * status -> false
     */
    public void switchOff() {
        status = false;
        System.out.println(this.getName()+" wurde ausgeschaltet.");
    }

    //*******************************
    // Instanzmethoden
    /**
     * @return String mit name, baujahr und status
     */
    @Override
    public String toString() {
        return "Roboter:\n\tName: "+this.name
                +"\n\tID: "+this.id
                +"\n\tBaujahr: "+this.baujahr
                +"\n\tEin/Aus: "+this.status;
    }

    /**
     * @param obj
     * @return true wenn obj vom Typ Roboter ist und sowohl Name als auch Baujahr
     * identisch sind, sonst false
     */
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Roboter &&
                (this.baujahr == ((Roboter)obj).baujahr) &&
                (this.name.equals(((Roboter)obj).name))) {
            return true;
        }
        else { 
            return false;
        }
    }

    /**
     * @return einen Hashcode fuer diesen Roboter
     */
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 67 * hash + this.baujahr;
        hash = 67 * hash + this.id;
        hash = 67 * hash + (this.status ? 1 : 0);
        return hash;
    }
}